/**
 * 将整数转换为字符串,修正在2的补码表示中最大负数无法正常处理的bug
 * 因为INT_MIN的绝对值比INT_MAX大1，所以-INT_MIN == -INT_MIN，无法用整数表示
 */

#include <stdio.h>
#include <string.h>
#include <limits.h>
#include <stdlib.h>

void itoa(int n, char s[]);
void reverse(char s[]);

int main() {
    char s[1000];
    int n = INT_MIN;
    itoa(n, s);
    printf("%d\n%s\n", n, s);

    return 0;
}

void itoa(int n, char s[]) {
    int i, sign;

    sign = n;

    i = 0;
    do {
        s[i++] = abs(n % 10) + '0';
    } while (n /= 10);
    if (sign < 0)
        s[i++] = '-';
    s[i] = '\0';
    reverse(s);
}

void reverse(char s[]) {
    int i, j;
    for (i = 0, j = strlen(s) - 1; i < j; i++, j--)
        s[i] ^= s[j], s[j] ^= s[i], s[i] ^= s[j];
}
